import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clas representa a un barco.
 * El barco puede tener una logitud que va de 1 a 4
 * 
 * @author Miguel Martinez Aguilar
 * @version 02 de Mayo del 2013
 */
public class Barco extends ScrollActor
{
    // Declaracion de variables de instancia
    private int longitud;// es la longitud del barco.
    private int tam;// es el tamaño total del barco.
    private Actor[] espacio;// es un arreglo de actores acorde al tamaño.
    private boolean vertical;// boleano que indica si este barco es horizontal o vertical.
    private Evaluador evaluador;// es el objeto Evaluador.
    private BarcoImg img;// es el BarcoImg correspondiente al tamaño.
    private int[] ancho;// es un arreglo de los anchos de los espacios correspondientes  al barco.
    private int[] altura;// es un arreglo de las alturas de los espacios correspondientes al barco.
    
    /**
     * Este es el constructor de barco (se inicializan las variables de instancia).
     * @param longitud: la longitud del barco (de 1 a 4).
     * @param eval: el objeto evaluador que determina la suerte de los barcos.
     */
    public Barco(int longitud, Evaluador eval) 
    {
        this.longitud = longitud;
        tam = longitud;
        ancho = new int[longitud];
        altura = new int[longitud];
        espacio = new Actor[longitud];
        vertical = false;
        evaluador = eval;
        img = null;
    }  
    
    /**
     * Este metodo entrega la longitud del barco. <p>
     * Regresa un entero.
     */
    public int longitud() 
    {
        return longitud;
    }
    
    /**
     * Este metodo especifica si el barco esta o no esta vertical.
     * @param vertical: un boleano que indica si este barco sera horizontal o vertical.
     */
    public void vertical(boolean vertical) 
    {
        this.vertical = vertical;
        if(img != null)img.vertical(vertical);
    }
    
    /**
     * Este metodo regresa el valor de vertical. <p>
     * Regresa un boleano.
     */
    public boolean vertical() 
    {
        return vertical;
    }
    
    /**
     * Este metodo asigna los espacios correspondientes al barco.
     * @param esp: un arreglo de espacios que seran agregados en este barco.
     * @param val: un boleano que indica si los espacios a agregar son validos.
     */
    public void asignaEspacios(Espacio[] esp, boolean val)
    {
        for(int i = 0; i < longitud; i++){
            if(val)esp[i].resalta(true);
            else esp[i].resaltaRojo();
            espacio[i] = esp[i];
        }
    }
    
    /**
     * Este metodo desasigna los espacios correspondientes al barco.
     */
    public void desAsignaEspacios()
    {
        for(int i = 0; i < longitud; i++){
            if(espacio[i] != null){
                ((Espacio)espacio[i]).resalta(false);
                espacio[i] = null;
            }
        }
    } 
    
    /**
     * Este metodo asigna al barco de forma permanente los espacios.
     */
    public void quedaFijo()
    {
        for(int i = 0; i < longitud; i++){
            ((Espacio)espacio[i]).resalta(false);
            ((Espacio)espacio[i]).tomaBarco(this,i);
            this.setImage("led1.png");
        }
        Espacio[] arr = new Espacio[longitud];
        for(int i = 0; i < longitud; i++){
            arr[i] = (Espacio)espacio[i];
        }
        img.dimenciones(arr);
    }
    
    /**
     * Este metodo corta la longitud del barco. <p>
     * Regresa un boleano que indica si el barco ya fue destruido.
     * @param pos: un numero que indica la posicion del barco donde a sufrido daño.
     */
    public boolean herir(int pos)
    {
        longitud--;
        ScrollWorld escena = super.getWorld();
        Fuego fuego = new Fuego();
        escena.addObject(fuego, ((Espacio)espacio[pos]).getGlobalX(), ((Espacio)espacio[pos]).getGlobalY());
        fuego.CambiaGetGlobalXY(((Espacio)espacio[pos]).getGlobalX(), ((Espacio)espacio[pos]).getGlobalY());
        ancho[pos] = (((Espacio)espacio[pos]).getImage()).getWidth();
        altura[pos] = (((Espacio)espacio[pos]).getImage()).getHeight();
        espacio[pos] = fuego;
        if(longitud == 0){
            evaluador.asignaElim(this);
            img.desOcultar();
        }
        return longitud == 0;
    }
    
    /**
     * Este metodo elimina los objetos contenidos en espacio[].
     */
    public void quitaFuego()
    {
        ScrollWorld escena = super.getWorld();
        ImagenM im = null;
        for(int i = 0; i < tam; i++){
            im = new ImagenM("restos.png");
            escena.addObject(im,((Fuego)espacio[i]).getGlobalX(),((Fuego)espacio[i]).getGlobalY());
            (im.getImage()).scale(ancho[i],altura[i]);
            ((Fuego)espacio[i]).detener();
            escena.removeObject((Fuego)espacio[i]);
            espacio[i] = im;
        }
        escena.removeObject(img);
    }
    
    /**
     * Este metodo crea explosiones en las ubicaciones de este barco.
     */
    public void explota()
    {
        ScrollWorld escena = super.getWorld();
        for(int i = 0; i < tam; i++){
            escena.addObject(new Explosion(),((Fuego)espacio[i]).getGlobalX(),((Fuego)espacio[i]).getGlobalY());
        }
    }
    
    /**
     * Este metodo resalta en rojo los espacios de este barco.
     */
    public void resaltaRojo()
    {
        for(int i = 0; i < longitud; i++){
            ((Espacio)espacio[i]).resaltaRojo();
        }
    }
    
    /**
     * Este metodo resalta en forma normal los espacios de este barco.
     * @param val: un boleano que indica como se resaltaran los espacios de este barco.
     */
    public void resalta(boolean val)
    {
        for(int i = 0; i < longitud; i++){
            ((Espacio)espacio[i]).resalta(val);
        }
    }
    
    /**
     * Este metodo asigna un barco imagen a este barco.
     * @param barco: un objeto imagen (de un barco) que representara a este barco en el escenario.
     */
    public void asignaBarcoImg(BarcoImg barco)
    {
        img = barco;
    }
}
